|
Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語(たとえばCやC++など)で書かれた、実際のCPUの上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。Java言語からネイティブコードを利用するためのABIと、逆にネイティブコードからJavaバイトコードを動作させるためのバーチャルマシンを利用するためのAPIの2つから成る。 JNIを使うことで、Java言語のバーチャルマシンで動作させるには処理速度の面で不利とされる計算量の多いプログラムを部分的にネイティブコードに置き換えて高速化したり、標準クラスライブラリからはアクセスできないオペレーティングシステムの機能を利用するプログラムを、あたかも通常のJavaクラスのように呼び出したりできるようになる。Java言語以外のJava VM上で動作する言語からも利用可能である。 JNIによる、Javaバーチャルマシンからネイティブコードの呼び出しは、バーチャルマシンの実行環境の一貫性を保つために、通常のJavaプログラムの実行時とは異なる例外的なメモリ管理や排他制御を必要とする場合があり、しばしばプログラムの実行速度の低下を招くことがある。そのため、単純にJNIを利用することでアプリケーション性能を改善できるというわけではない。 == JNIの動作 == JNIフレームワークでは、ネイティブ関数は.cもしくは.cppファイルに分離して実装する。C++はJNIに対して多少洗練されたインターフェイスを提供する。Java VMは'' JNIEnv ''ポインタ、''jobject ''ポインタ、そしてJavaメソッドで定義されたすべてのJava引数を通して、ネイティブな関数を起動する。JNI関数は以下のような形式となる。JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj) '' env ''ポインタはJava VMへのインタフェースを含む構造体である。これはJava VMとの相互作用および、Javaオブジェクトとの連携に必要な全ての関数を含んでいる。JNI関数の例としては、ネイティブ配列とJava配列の相互変換、ネイティブ文字列とJava文字列の相互変換、オブジェクトのインスタンス化、例外の送出などが挙げられる。基本的には、Javaコードでできることは全てJNIEnv を用いて行うことができる。以下の例示ではJava文字列をネイティブな文字列に変換する。//C++ code JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString) / *C code */ JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString) C++ではJavaのように、オブジェクトのメソッドという概念を持つため、C++のJNIコードはCのそれに比べて文法的に多少クリアである。 Cでは env パラメータは( で被参照され、env はオブジェクトメソッド起動セマンティクスの一部として、明示的に JNIEnv メソッドに渡されなければならない。C++では env パラメータはenv-> で被参照される。env パラメータはオブジェクトメソッド起動セマンティクスの一部として暗黙的に渡される。ネイティブ変数型とJava変数型はそれぞれ相互変換をすることができる。オブジェクトや配列、文字列などの合成型のために、ネイティブコードは JNIEnv のメソッド呼び出しにおいて、明示的なデータの変換を行う必要がある。抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Java Native Interface」の詳細全文を読む スポンサード リンク
|